package com.frank.work;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils;

import java.util.List;
import java.util.Optional;

/**
 * @author 小石潭记
 * @date 2021/12/20 19:05
 * @Description: 流水线节点
 */
@Data
@Slf4j
public class PipelineNode {
    /**
     * 任务名
     */
    private String taskName;

    /**
     * 任务所在的组
     */
    private String taskGroup;

    /**
     * 当前节点需要执行的任务
     */
    private AbstractPipelineNodeTask nodeTask;

    /**
     * 当前任务下的节点子任务
     */
    private List<? extends PipelineNode> childNodes;

    /**
     * 该节点下面的子节点是否多个
     */
    private Boolean manyNodeFlag;

    /**
     * 执行方法，调用抽象节点的execute方法，每个节点规定返回optional
     * @param args
     */
    public void service(Object args) {
        Object result = nodeTask.execute(args, this);
        // 结果为空则直接返回
        if (result == null) {
            return;
        }
        // 根据自己的业务代码规定返回值为optional,如果不是optional则直接返回
        if (result instanceof Optional) {
            if (!((Optional) result).isPresent()) {
                return;
            }
        }
        // 如果子节点为null，则直接结束，不进行后续处理，如果该节点本身就是根节点的下面的一个子节点
        // 根节点的子节点有两个，并且这两个完了再执行下面的节点
        //        if (CollectionUtils.isEmpty(childNodes) && manyNodeFlag == false) {
        if (CollectionUtils.isEmpty(childNodes)) {
            return;
        }
        childNodes.forEach(task -> {
            try {
                task.service(result);
            } catch (Exception e) {
                log.error("处理任务:{}异常:{}", task, e.getMessage());
            }
        });
    }

}
